package tech.yunjing.train.dao;

import com.mongodb.WriteResult;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import tech.yunjing.train.entity.VerificationCode;
import tech.yunjing.train.util.ReflectionMongoDBUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * purpose： 实现验证码Dao
 * Created by Administrator on 2017/6/10.
 */
public class CodeMongoDaoImpl<T> implements CodeMongoDao<T> {

    /**
     * spring mongodb　集成操作类　
     */
    @Resource
    protected MongoTemplate mongoTemplate;

    /**
     * 注入mongodbTemplate
     * @param mongoTemplate 模板
     */
    protected void setMongoTemplate(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    /**
     * 获得泛型类
     */
    private Class<T> getEntityClass() {
        return ReflectionMongoDBUtils.getSuperClassGenricType(getClass());
    }

    /**
     * 判断验证码是否存在
     * @param verificationCode 验证码
     * @return ture = 存在  false = 不存在(可用)
     */
    @Override
    public boolean isVerificationCodeExists(String verificationCode) {
        return mongoTemplate.collectionExists(verificationCode);
    }

    /**
     * 查询所有验证码
     * @return 验证码集合
     */
    @Override
    public List<T> findAllVerificationCode(VerificationCode verificationCode) {
        return mongoTemplate.findAll(this.getEntityClass());
    }

    /**
     * 保存验证码
     * @param verificationCode 实体类
     * @return 验证码
     */
    @Override
    public T saveCode(T verificationCode) {
        mongoTemplate.save(verificationCode);
        return verificationCode;
    }

    /**
     * 修改验证码状态
     * @param query 查找
     * @param update 修改
     * @return 结果
     */
    @Override
    public WriteResult updateVerificationCodeStatus(Query query, Update update) {
        if (update==null) {
            return null;
        }
        return mongoTemplate.updateMulti(query, update, this.getEntityClass());
    }

    /**
     * 根据条件查找一条数据
     * @param query 查找对象
     * @return 查找到的对象
     */
    @Override
    public T findCodeOne(Query query) {
        return mongoTemplate.findOne(query,getEntityClass());
    }

    /**
     * 根据verificationCode查询
     * @param verificationCode 验证码
     * @return 验证码
     */
    @Override
    public T findByUserAccount(String verificationCode) {
        return mongoTemplate.findById(verificationCode,getEntityClass());
    }

}
